# 自定义权限验证类
from rest_framework.exceptions import PermissionDenied, NotAuthenticated
from rest_framework.permissions import BasePermission
# 必须继承基础权限类BasePermission
class CustomPermission(BasePermission):
    # 重写系统方法has_permission
    def has_permission(self, request, view):
        # 获取当前请求的方法名称
        action = getattr(view, 'action', None)
        # print(action,'action')
        # 获取当前接口类的权限映射字典
        rbac_pers = getattr(view, 'rbac_permissions', {})
        # 没有设置权限代码, 默认没有权限限制
        # 如果请求的是登录接口, 不进行权限验证
        if not rbac_pers or action == 'login':
            return True
        # 获取当前请求接口的权限代码
        current_code_name = rbac_pers.get(action)
        # 查询当前用户是否拥有当前接口权限
        user = request.user
        if not user['id'] > 0:
            # 返回http状态码: 401
            raise NotAuthenticated('您还没有登录,请先登录!')
        else:
            # 获取当前用户所有的权限代码
            all_code_name = [val['code'] for item in user['role'] for val in item['permission']]
            # 返回True表示有操作权限, False表示没有操作权限
            if current_code_name in all_code_name:
                return True
            # 通过PermissionDenied()设置自定义错误提示信息, 返回http状态码:403
            raise PermissionDenied('暂无该接口方法的操作权限!')
